package day18.Junit_reflect_annotation_proxy.reflectdemo;

import java.lang.reflect.Method;
import java.util.ArrayList;

public class role_of_reflect
{
    public static void main(String[] args) throws Exception {
        //反射作用：
        //1拿到类本身
        //2破坏封装性--->绕过权限
        //绕过泛型的约束

        ArrayList<String> list=new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add("java");
//        list.add(9.9);
//        list.add(true); 这都是编译阶段，编译器给你的约束，而反射的调用方法实现时机是在编译后运行的时候（所有的泛型都会被抹去变成Object），我再拿到add方法的时候，可以添加一些非字符串的内容
       // Java 泛型的一个重要特性，即类型擦除（Type Erasure）。在 Java 中，泛型是在编译时进行类型检查的，但在运行时(正好对应反射的作用时机)，所有的泛型信息都会变成它们的原始类型（通常是 Object）。这意味着在运行时可以添加任何类型的对象因为是满足Object类型的
        // ，你通过反射可以绕过编译时的类型检查，添加不符合泛型约束的对象到集合中。
        Class c1=list.getClass();
        Method  m1=c1.getDeclaredMethod("add",Object.class);
        m1.invoke(list,9.9);
        m1.invoke(list,true);
        System.out.println(list);



//


    }
//    public static void func(Object obj)
//    {
//        //调用obj的class方法
//        Class c1=obj.getClass();
//  //      在 func 方法内部，obj.getClass() 会返回 obj 的实际运行时类型。
////        由于 obj 是 Integer 对象，c1 将是 Integer.class。
//    }
}
